package br.com.ecomanda.main;

import java.util.ArrayList;
import java.util.List;

import br.com.ecomanda.controller.EComandaController;
import br.com.ecomanda.controller.LoginController;
import br.com.ecomanda.controller.OperacaoComandaController;
import br.com.ecomanda.controller.PagamentoController;
import br.com.ecomanda.controller.PedidoController;
import br.com.ecomanda.dao.ComandaDao;
import br.com.ecomanda.dao.FormaPagamentoDao;
import br.com.ecomanda.dao.FuncionarioDao;
import br.com.ecomanda.dao.GarcomDao;
import br.com.ecomanda.dao.ItemDao;
import br.com.ecomanda.dao.OperacaoComandaDao;
import br.com.ecomanda.dao.PedidoDao;
import br.com.ecomanda.dao.StatusPedidoDao;
import br.com.ecomanda.enumerations.StatusPedidoEnum;
import br.com.ecomanda.exceptions.ComandaAbertaMaisDeUmaVezException;
import br.com.ecomanda.model.Comanda;
import br.com.ecomanda.model.FormaPagamento;
import br.com.ecomanda.model.Funcionario;
import br.com.ecomanda.model.Item;
import br.com.ecomanda.model.OperacaoComanda;
import br.com.ecomanda.model.Pedido;
import br.com.ecomanda.model.StatusPedido;

public class Main {

	public static EComandaController parent;	
	public static OperacaoComandaController ocController;	
	public static PedidoController pedidoController;	
	public static PagamentoController pagamentoController;	
	public static LoginController loginController;	
	public static ComandaDao comandaDao;
	public static FuncionarioDao funcionarioDao;
	public static GarcomDao garcomDao;
	public static ItemDao itemDao;
	public static PedidoDao pedidoDao;
	public static StatusPedidoDao spDao;
	public static FormaPagamentoDao fpDao;
	
	public static void init(){
		try{
			parent = new EComandaController();	
			ocController = parent.getOperacaoComandaController();	
			pedidoController = parent.getPedidoController();	
			pagamentoController = parent.getPagamentoController();	
			loginController = new LoginController();	
			comandaDao = new ComandaDao();
			funcionarioDao = new FuncionarioDao();
			garcomDao = new GarcomDao();
			itemDao = new ItemDao();
			pedidoDao = new PedidoDao();
			spDao = new StatusPedidoDao();
			fpDao = new FormaPagamentoDao();
		} catch(Exception e){
			System.err.println(e.getMessage());
		}
	}
	
	public static void main(String[] args) throws ComandaAbertaMaisDeUmaVezException {
		init();
	}

	public static void testeAbrirComanda(int comandaId, int funcionarioId) {
		Comanda comanda = comandaDao.getById(comandaId);
		Funcionario funcionario = funcionarioDao.getById(funcionarioId);

		try {
			ocController = new OperacaoComandaController(parent);
			ocController.abrirComanda(comanda, funcionario);
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}
	}

	public static void testeAtualizarPedido() {
		Pedido pedido = pedidoDao.getById( 1 );		
		Funcionario funcionario = funcionarioDao.getById( 11 );
		
		try {
			pedidoController.atualizarStatusPedido(pedido, StatusPedidoEnum.CANCELADO, funcionario);
		} catch (Exception e) {
			System.err.println( e.getMessage() );
		}
	}

	public static void testeComandaAberta(int comandaId) {
		Comanda comanda = comandaDao.getById(comandaId);
		
		try {
			OperacaoComandaDao operacaoComandaDao = new OperacaoComandaDao();
			System.out.println( operacaoComandaDao.getOperacaoAberta( comanda ) );
		} catch (Exception e) {
			System.err.println( e.getMessage() );
		}
	}

	public static void testeEfetuarPagamento(int comanda, float valorPago, int formaDePagamento, int funcionario) {
		try {
			OperacaoComanda operacaoComanda = ocController.getOperacaoAberta( comandaDao.getById(comanda) );
			
			List<OperacaoComanda> operacoes = new ArrayList<OperacaoComanda>();
			operacoes.add( operacaoComanda );
			
			FormaPagamento fdp = fpDao.getById(formaDePagamento);
			Funcionario func = funcionarioDao.getById(funcionario);
			
			pagamentoController.efetuarPagamento(operacoes, valorPago, fdp, func);
		} catch (Exception e) {
			System.err.println( e.getMessage() );
		}
	}

	public static void testeEncerrarComanda(int comandaId, int funcionarioId) {
		Comanda comanda = comandaDao.getById(comandaId);
		Funcionario funcionario = funcionarioDao.getById(funcionarioId);
		
		try {
			ocController = new OperacaoComandaController(parent);
			ocController.encerrarComanda(comanda, funcionario, null);
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}
	}

	public static void testeFazerPedido(int comandaId, int itemId, float quantidade, int garcomId) {
		Comanda comanda = comandaDao.getById(comandaId);
		Item item = itemDao.getById(itemId);
		Funcionario garcom = funcionarioDao.getById(garcomId);
		
		try {
			pedidoController.registrarPedido(comanda, item, quantidade, garcom, null, "Mal passada");
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println( e.getMessage() );
		}
	}

	public static void testeLogin(String username, String plainTextPassword) {
		Funcionario func;
		try {
			func = loginController.login(username, plainTextPassword);
			System.out.println( func.getDsNome() );
		} catch (Exception e) {
			System.err.println( e.getMessage() );
		}		
	}

	public static void testeTransicaoPermitida() {
		StatusPedido status1 = spDao.getById( StatusPedidoEnum.CANCELADO.getStatus() );
		StatusPedido status2 = spDao.getById( StatusPedidoEnum.ENTREGUE.getStatus() );
		
		System.out.println( pedidoController.transicaoPermitida(status1, status2) );
	}

}
